package com.cy.pj.notice.web.controller;

import com.cy.pj.notice.service.SysNoticeService;
import com.cy.pj.notice.web.JsonResult;
import com.cy.pj.notice.pojo.dao.SysNotice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 此对象为公告模块控制层处理器对象
 * 1.请求url设计
 *      (1)条件查询（请求方式-Get,请求url/notice/)
 *      (2)新增公告（请求方式-Post,请求url/notice)
 *      (3)基于id查询（请求方式-Get,请求url/notice/{id})
 *      (4)更新公告（请求方式-Put,请求url/notice/)
 *      (5)删除公告（请求方式-Delete,请求url/notice/{id}
 *
 * 2.请求参数设计
 *      (1)参数传递方式
 *          - 将请求参数通过url进行传递
 *              http://ip:port/?title=my&type=1
 *              http://ip:port/10
 *          - 请求参数通过请求体进行传递
 *             {"title","Study Spring Boot","Content"}
 *      (2)服务端接收请求参数
 *          - 直接量（8种基本数据类型，字符串，日期）
 *          - pojo对象(但是需要提供和参数名对应的set方法)
 *          - map对象(前提是必须使用@RequestParam或@RequestBody注解对参数进行描述)
 *      (3)方法参数描述
 *          - @PathVariable 用来描述变量,获取请求url中{}内部的变量
 *          - @RequestBody 用来接收json格式的数据
 *          - @RequestParam 用来设定必须给相关参数设定值，获取非json格式的请求参数数据
 *          - @DateTimeFormat 用来设置可以接收的日期字符串格式
 *
 *  3.响应标准设计(状态，消息，数据)：JsonResult
 *
 *
 *
 */
@RestController
@RequestMapping("/notice/")
public class SysNoticeController {
    @Autowired
    private SysNoticeService sysNoticeService;


    //不带参数的请求url:http://localhost:9090/notice/
    //带参数的请求url:http://localhost/notice/?type=0&title="通知"
    @GetMapping
    public JsonResult doFindNotices(SysNotice notice){
        return new JsonResult(sysNoticeService.findNotices(notice));
    }


    /**
     * 新增公告信息
     * @param notice 封装客户端提交的通告信息，假如使用@RequestBody对参数进行描述，客户端可以向服务端传递json格式
     *               的字符串参数，服务端拿到以后，会将json字符串转为参数类型的对象（这个过程还可以理解为json反序列化）
     *               注意：一个Controller方法中只能有一个参数使用@RequestBody注解进行描述。
     * @return
     */
    @PostMapping
    public JsonResult doSaveNotice(@RequestBody SysNotice notice){
         sysNoticeService.insertNotice(notice);
        return new JsonResult("新增完成");//json序列化（将对象转换为json格式字符串）
    }

    /**
     * rest风格的url中允许使用变量，但这个变量需要使用{}括起来，当我们在方法参数中需要这个变量值时，
     * 可以使用@PathVariable对方法参数进行描述
     * 访问url:http://localhost/notice/1
     * @param id
     * @return
     */
    @GetMapping("{id}")
    public JsonResult doFindById(@PathVariable Long id){
        return new JsonResult(sysNoticeService.findById(id));
    }

    /**
     * 更新公告信息
     * @param notice 封装了更新消息的对象
     * @return
     */
   @PutMapping
    public JsonResult doUpdateNotice(@RequestBody SysNotice notice){
        sysNoticeService.updateNotice(notice);
        return new JsonResult("更新完成");
    }

    /**
     * 基于id执行删除业务
     * @param id
     * @return
     */
    @DeleteMapping("{id}")
    public JsonResult doDeleteById(@PathVariable Long... id){
       sysNoticeService.deleteById(id);
       return  new JsonResult("删除成功");
    }

}

